﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace FrbaCommerce.AccessData
{
    class adRol
    {

        //La siguiente funcion, me devuelve una lista de "Nombres" de funcionalidades
        public static List<String> FuncDe(Int32 rol)
        {
            List<String> listaDeFuncionalidades = new List<String>();

            SqlConnection conexion = Program.obtenerConexion();
            SqlCommand cmd = Codigo_reutilizable.FuncionesBaseDatos.crearProcedure("GD1C2014.dbo.funcionalidadesDelRol", conexion,
           new SqlParameter("@Rol", rol));
            SqlDataReader lectura = cmd.ExecuteReader();
            while (lectura.Read())
            {
                //acá le digo que me traiga la segunda columna del SP (func_nombre)
                listaDeFuncionalidades.Add(lectura.GetString(1));
            }
            return listaDeFuncionalidades;

        }


        //La siguiente funcion, me devuelve una lista de "ID" de funcionalidades del rol especificado
        public static List<int> buscarFuncDe(int rol)
        {
            List<int> listaDeFuncionalidades = new List<int>();

            SqlConnection conexion = Program.obtenerConexion();
            SqlCommand cmd = Codigo_reutilizable.FuncionesBaseDatos.crearProcedure("GD1C2014.dbo.funcionalidadesDelRol", conexion,
           new SqlParameter("@Rol", rol));
            SqlDataReader lectura = cmd.ExecuteReader();

            while (lectura.Read())
            {
                //acá le digo que me traiga la primer columna del SP (func_id)
                listaDeFuncionalidades.Add(Convert.ToInt32(lectura.GetValue(0)));
            }
            return listaDeFuncionalidades;

        }


        public static int obtenerRolusuario(int usuario)
        {
            Gets_and_Sets.RolUsuario_getset rolUsuario = new Gets_and_Sets.RolUsuario_getset();


            SqlConnection conn = Program.obtenerConexion();
            SqlCommand cmd = Codigo_reutilizable.FuncionesBaseDatos.crearProcedure("GD1C2014.dbo.obtenerRolusuario", conn,
            new SqlParameter("@Id", usuario));

            SqlDataReader lectura = cmd.ExecuteReader();
            while (lectura.Read())
            {
                rolUsuario.ru_rol = Convert.ToInt32(lectura.GetValue(0));
            }

            conn.Close();
            return (rolUsuario.ru_rol);
        }


        public static void buscarListaRoles(Gets_and_Sets.Rol_getset List, DataGridView dgv1)
        {
            SqlConnection conn = Program.obtenerConexion();
            SqlCommand cmd = new SqlCommand("SELECT rol_id, rol_nombre FROM [GD1C2014].[Monkey_Coders].[Roles]", conn);
            
            Codigo_reutilizable.FuncionesBaseDatos.CompletarDataGrid(dgv1, conn, cmd);

        }


        public static Gets_and_Sets.Rol_getset obtenerRol(Int32 rolId)
        {
            Gets_and_Sets.Rol_getset rol = new Gets_and_Sets.Rol_getset();


            SqlConnection conn = Program.obtenerConexion();
            SqlCommand cmd = Codigo_reutilizable.FuncionesBaseDatos.crearProcedure("GD1C2014.dbo.obtenerRol", conn,
            new SqlParameter("@Id", rolId));
            
            SqlDataReader lectura = cmd.ExecuteReader();
            while (lectura.Read())
            {
                rol.Nombre = lectura.GetString(1);
                rol.Habilitado = Convert.ToInt16(lectura.GetValue(2));
            }

            conn.Close();
            return rol;
        }


        public static void actualizarRol(Gets_and_Sets.Rol_getset Rol, int rolAModificar)
        {
            int retorno;
            using (SqlConnection conn = Program.obtenerConexion())
            {
                SqlCommand cmd = Codigo_reutilizable.FuncionesBaseDatos.crearProcedure("GD1C2014.dbo.actualizarRol", conn,
                new SqlParameter("@Id", rolAModificar),
                new SqlParameter("@Nombre", Rol.Nombre),
                new SqlParameter("@Estado", Rol.Habilitado));



                retorno = cmd.ExecuteNonQuery();
                conn.Close();
            }

            Codigo_reutilizable.Resultado.validar(retorno, "Nombre y Estado del ROL Actualizados");

        }



        public static void agregarFuncionalidadesRol(int rolAModificar, List<int> funcionalidades)
        {
            using (SqlConnection conn = Program.obtenerConexion())
            {
                int retorno;
                foreach (int funcionalidad in funcionalidades)
                {
                    SqlCommand cmd = Codigo_reutilizable.FuncionesBaseDatos.crearProcedure("GD1C2014.dbo.agregarFuncRol", conn,
                    new SqlParameter("@Id_Rol", rolAModificar),
                    new SqlParameter("@Id_Funcionalidad", funcionalidad));


                retorno = cmd.ExecuteNonQuery();
                Codigo_reutilizable.Resultado.validar(retorno, "funcionalidad agregada al ROL");
                }
                conn.Close();
                

            }

            
        }



        public static void borrarFuncionalidadesRol(int rolAModificar)
        {
            int retorno;

            using (SqlConnection conn = Program.obtenerConexion())
            {
                SqlCommand cmd = Codigo_reutilizable.FuncionesBaseDatos.crearProcedure("GD1C2014.dbo.borrarFuncRol", conn,
                new SqlParameter("@Id_Rol", rolAModificar));

                retorno = cmd.ExecuteNonQuery();
                conn.Close();
            }

            Codigo_reutilizable.Resultado.validar(retorno, "Funcionalidades desvinculadas del ROL");
        }


        public static void ActualizarRolEliminado(int rolAEliminar)
        {
            int retorno;
            using (SqlConnection conn = Program.obtenerConexion())
            {
                SqlCommand cmd = Codigo_reutilizable.FuncionesBaseDatos.crearProcedure("GD1C2014.dbo.bajaRol", conn,
                new SqlParameter("@Id", rolAEliminar));


                retorno = cmd.ExecuteNonQuery();
                conn.Close();
            }
            Codigo_reutilizable.Resultado.validar(retorno, "Rol eliminado");

        }
        
    }
}